一個新的寫入的動作,replica node有所回應,也代表著已將資料寫入Memtable,和Commit Log。
Memtable,是記憶體空間,Commit Log是存在硬碟裡面,存放資料的內容,包括寫入的時間戳。
更新的資料容量在Memtable達到一個程度,會再將資料更新到SSTable,SSTable也是存在硬碟裡面。
資料從Memtable寫入到SSTable之後(這個行為會暫時把寫入動作鎖住),相對應的Commit Log部分,後續就會被刪除。
換個方面來看,Commit Log也是為了在將資料真正寫入硬碟之前,若發生遺失的狀況,可以復原資料的依據。
因此寫入SSTable之後,Commit Log就可以被刪除了。
下圖為資料寫入的流程:
到此要稍微介紹一下,SCYLLA的資料結構是採取LSM
(log-structured merge-tree LSM 樹),意思是日誌(log)結構的合併樹,透過順序寫入來優化寫入的方式。
LSM使用SSTable(Sorted Strings Table),一種key-value的資料格式,key會按照順序排序,多組key-value又做成一個segment,SSTable由許多segment組成。。
一但Memtable的資料寫到SSTable,那個該SSTable就不能再做變更,只能被讀取。
下個Memtable過來的資料,會寫入到一個新的SSTable。
所以在讀取一個table資料的時候,基本上需要跨很多SSTable和Memtable做查詢,並且將資料合併整理,才是呈現我們看到的結果。
而SSTable數量太多或太破碎,會造成讀取效能上的不優,所以當SSTable數量太多的時候,系統就會自動執行壓縮(compaction)
的動作。
壓縮的動作是把許多小的SSTable,合併到一個大的SSTable,如果有先後對一筆資料做更新的多筆commit,會只留下更新時間最新的那筆。